'''
TODO 函数参数
函数可以作为参数一样去使用

def func01():
    print("this is func01")
# 函数名存放的是函数所在空间的地址
# func01()

def foo(func):
    func()
foo(func01)

TODO 闭包
1、定义：再函数嵌套的前提下，内部函数使用了外部函数的变量，并且外部函数返回了内部函数，把这个使用外部函数变量的内部函数称为闭包
2、构成条件：
      ① 在函数嵌套（函数里再定义函数）的前提下
      ② 内部函数使用了外部函数的变量（还包括外部函数的参数）
      ③ 外部函数返回了内部函数
3、闭包可以对外部函数的变量进行保存
# 外部函数
def func_out(num1):  # num1=10
    # 内部函数（使用了外部函数变量num1）
    def func_inner(num2):
        num = num1 + num2
        print("结果是：", num)
    # 外部函数返回了内部函数，这里返回的就是闭包
    return func_inner  # f接收到func_out的返回值
                         即：f = func_inner
                            f() = func_inner()
# 创建闭包实例
f = func_out(10) # 调用闭包，相当于调用内部函数func_inner
# 执行闭包
f(1) 10+1
f(2) 10+2


def name(name):
    def say(info):
        print(name + ":" + info)
    return say
zhang = name("张三")
zhang("到北京了吗？")

li = name("李四")
li("我已经到了！")


def func1(n1):
    def func2(n2):
        nonlocal n1  # 或：global n1
        n1 = n2 + 10
    print(n1)  6
    func2(10)
    print(n1)  20
    return func2
f = func1(6)
'''
